import axios from 'axios';
import { message } from 'ant-design-vue'; // 使用Ant Design Vue作为UI库，用于消息提示
// import router from '@/router'; // 引入路由实例，用于重定向等
// import store from '@/store'; // 引入Vuex store，用于获取token等

// 1. 创建一个独立的Axios实例
const service = axios.create({
  // baseURL: process.env.VUE_APP_BASE_API, // 从环境变量中获取API基础URL
  baseURL: 'https://cnodejs.org/api/v1', // 或者设置为你的后端API地址
  timeout: 10000, // 请求超时时间
  headers: {
    'Content-Type': 'application/json;charset=UTF-8'
  }
});
// 全局的loading状态控制
let requestCount = 0; // 记录正在进行的请求数量
function showLoading() {
  if (requestCount === 0) {
    // 在Ant Design Vue 4.x中，使用简单的loading提示
    message.loading('加载中...', 0); // 0表示不自动关闭
  }
  requestCount++;
}
function hideLoading() {
  requestCount--;
  if (requestCount === 0) {
    // 关闭loading消息
    message.destroy();
  }
}
// 2. 请求拦截器
service.interceptors.request.use(
  config => {
    // 在发送请求之前做些什么
    showLoading(); // 显示加载动画

    // 假设你的token存储在Vuex store中
    // const token = store.getters.token; // 根据你的store结构调整
    // if (token) {
    //   config.headers.Authorization = `Bearer ${token}`; // 添加Token到请求头
    // }

    // 处理某些特定请求类型，例如文件上传
    if (config.isUpload) {
      config.headers['Content-Type'] = 'multipart/form-data';
    }

    // 可以在这里处理取消请求逻辑
    // config.cancelToken = new axios.CancelToken(cancel => {
    //   store.dispatch('addCancelToken', cancel); // 存储取消函数
    // });

    return config;
  },
  error => {
    // 对请求错误做些什么
    hideLoading(); // 隐藏加载动画
    console.error('请求拦截器错误:', error);
    return Promise.reject(error);
  }
);
// 3. 响应拦截器
service.interceptors.response.use(
  response => {
    // 对响应数据做些什么
    hideLoading(); // 隐藏加载动画

    const res = response.data;
    console.log(res)
    // 根据后端返回的状态码进行判断
    // if (res.code !== 20000 && res.code !== 200) { // 假设成功状态码为20000或200
    if (!res.success) {
      message.error(res.message || 'Error');

      // 401: Token失效或者未登录
      if (res.code === 401) {
        message.error('登录状态失效，请重新登录');
        // 清除token并跳转到登录页
        // store.dispatch('user/resetToken').then(() => { // 假设你有一个resetToken action
        //   router.push('/login');
        // });
      }
      return Promise.reject(new Error(res.message || 'Error'));
    } else {
      return res; // 返回实际的数据
    }
  },
  error => {
    // 对响应错误做些什么
    hideLoading(); // 隐藏加载动画
    console.error('响应拦截器错误:', error);

    let message = error.message;
    if (error.response) {
      switch (error.response.status) {
        case 400:
          message = '请求错误';
          break;
        case 401:
          message = '未授权，请重新登录';
          // store.dispatch('user/resetToken').then(() => {
          //   router.push('/login');
          // });
          break;
        case 403:
          message = '拒绝访问';
          break;
        case 404:
          message = '请求地址出错';
          break;
        case 500:
          message = '服务器内部错误';
          break;
        case 502:
          message = '网关错误';
          break;
        case 503:
          message = '服务不可用';
          break;
        case 504:
          message = '网关超时';
          break;
        default:
          message = `连接错误 ${error.response.status}`;
      }
    }
    message.error(message);
    return Promise.reject(error);
  }
);
export default service;